#include <fstream>   // file I/O
#include <iostream>
#include <iomanip>   // format manipulation
#include <string>
#include <list>
#include <stdlib.h>
#include "./classes/Instancia.h"
#include "./classes/TFloat.h"

using namespace std;

/****************************************************************
 *.in:   El archivo contiene primero la cantidad de rocas, 
		  seguida de las ubicaciones x1 , . . . , xn de las rocas
		  (las coordenadas se separan por espacios en blanco).
		  Luego se informan los vectores a y b que definen la 
		  trayectoria de Superman, finalizando el archivo con
		  el valor critico C.

****************************************************************/
TFloat* getCoordenadas(string x, string y, string z, int p){
	TFloat* coord = new TFloat[3];

	coord[0] = TFloat(atof(x.c_str()), p);
	coord[1] = TFloat(atof(y.c_str()), p);
	coord[2] = TFloat(atof(z.c_str()), p);

	return coord;

}

void setCoord(Instancia* ins, int j, string x, string y, string z, int p){
	ins->_rocas[j][0] = TFloat(atof(x.c_str()), p);
	ins->_rocas[j][1] = TFloat(atof(y.c_str()), p);
	ins->_rocas[j][2] = TFloat(atof(z.c_str()), p);

}

int main(int argc, char *argv[]){
	string inputFile = argv[2];
	if(inputFile == "") inputFile = "Tp1.in";
	ifstream fp_in(inputFile.c_str(), ios::in);    	//Archivo de entrada
                                                   //Salida por pantalla
  
	int precision = atoi(argv[1]);
	cout<<endl;
	cout<< "La precision usada en este caso es " << precision << "." << endl;

	string input;
	Instancia* instancia;
	list<Instancia*> instancias;
	int num_inst=0;
	int rocas;
	double c;
	string x, y, z;

	while(1){
		if(!(fp_in>>input)) break;
		if (input == "$"){					//Hasta que encuentre signo "$"
			break;
		}else{
			rocas = atoi(input.c_str());
			instancia = new Instancia(rocas, precision);
			for(int i = 0; i < rocas; i++){
				if(!(fp_in>>x>>y>>z)) break;
				setCoord(instancia, i, x, y, z, precision);
			}
			if(!(fp_in>>x>>y>>z)) break;
			instancia->_a = getCoordenadas(x, y, z, precision);
			if(!(fp_in>>x>>y>>z)) break;
			instancia->_b = getCoordenadas(x, y, z, precision);
			if(!(fp_in>>input)) break;
			c = atof(input.c_str());
			instancia->_valorCritico = TFloat(c, precision);
			
			instancias.push_back(instancia);
			num_inst++;
		}
	}

	for(int i=0; i<num_inst; i++){
		(instancias.front())->print();
		instancias.pop_front();
	}

    return 0;
}


